/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package master_server;

import dao.HibernateFactory;
import hiber.Configuration;
import hiber.Historique;
import hiber.Joueur;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author A.KAren
 *
 *
 * Hibernate Connector
 */
public class HiberMastermind {

    public HiberMastermind() {
    }
    private static Session session;
    private Query query;

    private void connect() {
        session = HibernateFactory.getSession();
        session.beginTransaction();
    }

    private void stop() {
        if (session.isConnected()) {
        session.close();
        }
    }
    //--------- Equivalent des functions de JDBC

    // insere le joueur Avec son pass dans la base de donnees renvoie false si user existe
    public boolean insererJoueur(String pseudoJ, String pass) {
        boolean out = false;
        if (joueurExistant(pseudoJ) == false) {
            connect();
            Joueur Jtemp = new Joueur(pseudoJ, pass);
            session.save(Jtemp);
            session.getTransaction().commit();
            out = true;
            // System.out.println("ca pla&nte ici dans bdd");
        } else {
            System.out.println("Joueur exist déjà");
        }

        stop();
        return out;
    }

    // ajout d'une config --- Revoir la BD... s'il faut pas en Auto increment de idC
    public void ajouterConfig(String difficulte, int col, int coul) {
        connect();
        query = session.createQuery("from Configuration"); // c'est bete de regarder la taille de la table pour y ajouter un truc
        List<? extends Configuration> lst = query.list();
        Configuration cTemp = new Configuration(lst.size() - 1, difficulte, col, coul);
        session.save(cTemp);
        session.getTransaction().commit();
        stop();
    }

    // ajout d'une partie   idC + IDJ + score
    public void insererPartie(int idConfig, int idJoueur, int leScore) {
        connect();
        Query cQuery = session.createQuery("from Configuration where idC="+idConfig);  // on reccupere l'objet correspondant
        Query jQuery = session.createQuery("from Joueur where idJ=" + idJoueur);
        List<? extends Configuration> Clst = cQuery.list();
        List<? extends Joueur> Jlst = jQuery.list();

        Historique hTemp = new Historique(Clst.get(0),Jlst.get(0), leScore);
        session.save(hTemp);
        session.getTransaction().commit();
        stop();
    }

    // ajout d'une partie   idC + NOM + score
    public void insererPartie(int idConfig, String nomJoueur, int leScore) {
        connect();
        Query cQuery = session.createQuery("from Configuration where idC="+idConfig);  // on reccupere l'objet correspondant
        Query jQuery = session.createQuery("from Joueur where pseudo='" + nomJoueur+"'");
        List<? extends Configuration> Clst = cQuery.list();
        List<? extends Joueur> Jlst = jQuery.list();

        Historique hTemp = new Historique(Clst.get(0),Jlst.get(0), leScore);
        session.save(hTemp);
        session.getTransaction().commit();
        stop();
    }

    // verif si joueur exist
    public boolean joueurExistant(String pseudoJ) {
        connect();
        boolean out = false;
        query = session.createQuery("from Joueur where pseudo='" + pseudoJ+"'");
        List<? extends Joueur> lst = query.list();
        if (!lst.isEmpty()) {
            out = true;
        }
        stop();
        return out;

    }

    // verif si joueur exist => verif si login + pass sont correct 
    public boolean joueurExistant(String pseudoJ, String pass) {

        connect();
        boolean out = false;
        query = session.createQuery("from Joueur where pseudo='" + pseudoJ + "' and pass='" + pass+"'");    //à achanger pour une clause where
        List<? extends Joueur> lst = query.list();
        if (!lst.isEmpty()) {
            out = true;
        }
        stop();
        return out;
    }

    // get IdC  en function de colonnes et couleurs
    public int getIdconf(int colonnes, int couleurs) {
        connect();
        query = session.createQuery("from Configuration where colonnes=" + colonnes + " and couleurs=" + couleurs);
        List<? extends Configuration> lst = query.list();
        int idC = lst.get(0).getIdC();
        stop();
        return idC;
    }

    // get best Score de chaque config pour un joueur donné
    public String[] getUStats(String nom) {
        String[] out = new String[3];
        connect();
        query = session.createQuery("from Historique where configuration in ( from Configuration where mode='Easy' and joueur in (from Joueur where pseudo='"+nom+"'))ORDER BY score DESC LIMIT 1");
        if (query.list().isEmpty()==false) {
            Historique hTemp = (Historique)query.list().get(0);
            out[0] = "Easy " + hTemp.getConfiguration() +" "+hTemp.getScore();
        } else {
            out[0] = "Easy ";
        }
        query = session.createQuery("from Historique where configuration in ( from Configuration where mode='Medium' and joueur in (from Joueur where pseudo='"+nom+"'))ORDER BY score DESC LIMIT 1");
        if (query.list().isEmpty()==false) {
            Historique hTemp = (Historique)query.list().get(0);
            out[1] = "Medium " + hTemp.getConfiguration() +" "+hTemp.getScore();
        } else {
            out[1] = "Medium ";
        }
        query = session.createQuery("from Historique where configuration in ( from Configuration where mode='Hard' and joueur in (from Joueur where pseudo='"+nom+"'))ORDER BY score DESC LIMIT 1");
        if (query.list().isEmpty()==false) {
            Historique hTemp = (Historique)query.list().get(0);
            out[2] = "Hard " + hTemp.getConfiguration() +" "+hTemp.getScore();
        } else {
            out[2] = "Hard ";
        }
        stop();
        return out;
    }

    // top 10 d'une configue donée
    public String[] getStats(String mode) { // pas fini .. faut transformer idJ par pseudo
         System.out.println("je suis dans getstats "+mode);
                                           //select new list (pseudo, configuration, score) 
        connect();                      // c'est quoi ce truc MATE????? 
                                        // and where configuration in( from Configuration where mode ='" + mode + "') ORDER BY score DESC LIMIT 10
       // query = session.createQuery(" from Historique where configuration in( from Configuration where mode ='" + mode + "') ORDER BY score DESC LIMIT 10");   
          query =session.createQuery("Select j.pseudo, h.configuration, h.score from Historique as h, Joueur as j where h.joueur=j.idJ and h.configuration in( from Configuration where mode ='" + mode + "') ORDER BY score DESC LIMIT 10");
          Object[] row;
          String[] out = new String[query.list().size()]; 
          int i=0;
       for(Iterator it=query.iterate();it.hasNext();){
        row = (Object[]) it.next();
        out[i]=row[0].toString()+" "+row[1].toString()+" "+row[2].toString();
        i++;
 }

              
        stop();
        return out ;
        //return out;
    }

    //------------------ DEMO---------------------------------  

    private static void affListeElem(List<? extends Element> lst) {
        for (Element elem : lst) {
            System.out.println(elem.ficheComplete());

        }
        System.out.println();
    }


    public static void main(String[] args) {


      HiberMastermind test = new HiberMastermind();
       // System.out.println(test.insererJoueur("user", "pass"));
       // test.insererPartie(2, 3, 500);
        //String[] txt =test.getUStats("karen");
        String[] txt =test.getStats("Easy");
       // System.out.println(txt[1]);
        //System.out.println(test.getIdconf(6, 6));

    }
}


//select new list (pseudo, configuration, score)